import matplotlib.pyplot as plt
import random
import ipywidgets as widgets
from IPython.display import display, clear_output, HTML
import time
import csv
import io
import base64

# Variable globale pour stocker les résultats des simulations
all_hist_global = []

def simulation(nb_des, nb_faces):
    population = nb_des
    historique = [population]
    while population > 0:
        survivants = 0
        for _ in range(population):
            if random.randint(1, nb_faces) != 1:
                survivants += 1
        population = survivants
        historique.append(population)
    return historique

def lancer_simulation(_):
    global all_hist_global
    n = nb_des.value
    f = nb_faces.value
    repetitions = nb_simulations.value

    all_hist = [simulation(n, f) for _ in range(repetitions)]
    all_hist_global = all_hist  # Stockage global pour export

    max_len = max(len(h) for h in all_hist)
    for i in range(repetitions):
        if len(all_hist[i]) < max_len:
            all_hist[i] += [all_hist[i][-1]] * (max_len - len(all_hist[i]))

    colormap = plt.colormaps.get_cmap('tab10')
    fig, ax = plt.subplots(figsize=(10, 6))
    ax.set_xlabel("Lancers")
    ax.set_ylabel("Nombre de dés restants")
    ax.set_title(f"Dés restants après chaque lancer ({repetitions} simulations)")
    ax.grid(True)

    for i, h in enumerate(all_hist):
        ax.plot(h, marker='x', linestyle='-', color=colormap(i % 10))
        clear_output(wait=True)
        display(ui, bouton_lancer, bouton_export, fig)
        time.sleep(0.2)

    plt.close(fig)

def create_download_link(data, filename="resultats_simulations.csv", title="Cliquez ici pour télécharger le fichier"):
    b64 = base64.b64encode(data.encode()).decode()
    href = f'<a download="{filename}" href="data:text/csv;base64,{b64}" target="_blank">{title}</a>'
    return HTML(href)

def exporter_csv(_):
    global all_hist_global
    if not all_hist_global:
        print("Aucune simulation à exporter. Lancez d'abord une simulation.")
        return

    max_len = max(len(h) for h in all_hist_global)

    for i in range(len(all_hist_global)):
        if len(all_hist_global[i]) < max_len:
            all_hist_global[i] += [all_hist_global[i][-1]] * (max_len - len(all_hist_global[i]))

    # Préparer les données CSV en mémoire
    output = io.StringIO()
    writer = csv.writer(output)
    entete = [f"Simulation {i+1}" for i in range(len(all_hist_global))]
    writer.writerow(entete)

    for ligne_idx in range(max_len):
        ligne = [all_hist_global[col][ligne_idx] for col in range(len(all_hist_global))]
        writer.writerow(ligne)

    csv_data = output.getvalue()
    output.close()

    clear_output(wait=True)
    display(ui, bouton_lancer, bouton_export)
    print("Fichier prêt à être téléchargé :")
    display(create_download_link(csv_data))

# Widgets
nb_des = widgets.BoundedIntText(
    value=100, min=1, max=1000,
    description="Nombre de dés :", layout=widgets.Layout(width='250px')
)
nb_faces = widgets.BoundedIntText(
    value=6, min=2, max=100,
    description="Nombre de faces :", layout=widgets.Layout(width='250px')
)
nb_simulations = widgets.BoundedIntText(
    value=5, min=1, max=10,
    description="Simulations :", layout=widgets.Layout(width='250px')
)

ui = widgets.HBox([
    widgets.VBox([nb_des, nb_faces, nb_simulations], layout=widgets.Layout(margin='10px'))
])

bouton_lancer = widgets.Button(description="Lancer la simulation")
bouton_lancer.on_click(lancer_simulation)

bouton_export = widgets.Button(description="Exporter les résultats")
bouton_export.on_click(exporter_csv)

display(ui, bouton_lancer, bouton_export)
